perm filename CARVEW.SAI[GEO,BGB] blob sn#001270 filedate 1972-12-10 generic text, type T, neo UTF8
00100	BEGIN	"CARVEW"
00200		DEFINE	α = "COMMENT";
00300	α DISPLAY DECLARATION;
00400		INTEGER ARRAY DPYBUF [1:1000];
00500		REQUIRE "DISPLY[SYS,BGB]" LOAD_MODULE;
00600		EXTERNAL PROCEDURE DPYSET (INTEGER ARRAY DPYBUF);
00700		EXTERNAL PROCEDURE AIVECT (INTEGER X,Y);
00800		EXTERNAL PROCEDURE  AVECT (INTEGER X,Y);
00900		EXTERNAL PROCEDURE DPYOUT (INTEGER POG);
01000		EXTERNAL PROCEDURE DPYSST (STRING S);
01100		INTEGER SFLG,CFLG,QFLG;
01200	α TRIG SUBR;
01300		REQUIRE "SAITRG[SYS,BGB]" LOAD_MODULE;
01400		EXTERNAL REAL PROCEDURE SQRT (REAL X);
01500		EXTERNAL REAL PROCEDURE SIN (REAL X);
01600		EXTERNAL REAL PROCEDURE COS (REAL X);
01700	α CLIPPER, ITS ARGS AND VALUES;
01800		REQUIRE "CLIPER[SYS,BGB]" LOAD_MODULE;
01900		EXTERNAL INTEGER PROCEDURE CLIPER;			
02000		EXTERNAL INTEGER XL,XH,YL,YH;
02100		EXTERNAL REAL X1,Y1,Z1,X2,Y2,Z2;
02200		EXTERNAL INTEGER XX1,YY1,XX2,YY2;
02300	α TV RASTER PARAMETERS;
02400		INTEGER LDX,LDY,LDZ;		α LOGICAL RASTER SIZE;
02500		REAL PDX,PDY;			α PHYSICAL RASTER SIZE;
02600		EXTERNAL REAL FOCAL,SX,SY,SZ;
02700	α CAMERA ORIENTATION AND LOCATION;
02800		REAL IX,IY,IZ,JX,JY,JZ,KX,KY,KZ,DX,DY,DZ;
02900		REAL PAN,TILT;
03000	α CAMERA PRINCIPLE VECTOR;
03100		REAL CX1,CY1,CZ1,CX2,CY2,CZ2,R;
03200	α LOOP COUNTERS & FILE SIZES;
03300		INTEGER I,J,M,N;
     

00100	α RASTER INITIALIZATION;
00200		PDX	←	10.6/2;
00300		PDY	←	 8.0/2;
00400		FOCAL	←	12.5;
00500		LDX	←	512;
00600		LDY	←	384;
00700		LDZ	←	1024;
00800		SX	←	-FOCAL*LDX/PDX;
00900		SY	←	-FOCAL*LDY/PDY;
01000		FOCAL	←	FOCAL*3.2808@-3;
01100		SZ	←	 FOCAL*LDZ;
01200		XL	←	-511;	XH	←	511;
01300		YL	←	-385;	YH	←	384;
01400	α THE 511 AND DPY RASTER FRAMES;
01500		DPYSET (DPYBUF);
01600		AIVECT(-511,-511);
01700		AVECT ( 511,-511);
01800		AVECT ( 511, 511);
01900		AVECT (-511, 511);
02000		AVECT (-511,-511);
02100		AIVECT(XL,YL);
02200		AVECT(XH,YL);
02300		AVECT(XH,YH);
02400		AVECT(XL,YH);
02500		AVECT(XL,YL);
02600		DPYOUT(0);
02700	α FILE OPENING CEREMONIES;
02800	BEGIN	"OPENER"
02900		LABEL L1,L2,L3;
03000		STRING STR;
03100		BOOLEAN FLG;
03200		OPEN(1,"DSK",8,2,0,0,0,0);
03300	L1:	OUTSTR (".V3D COURSE FILE = ");
03400		STR	←	INCHWL;
03500		LOOKUP(1,STR&".V3D",FLG);
03600		IF FLG THEN GO L1;
03700		OPEN(2,"DSK",8,2,0,0,0,0);
03800	L2:	OUTSTR (".V3D  ROAD  FILE = ");
03900		STR	←	INCHWL;
04000		LOOKUP(2,STR&".V3D",FLG);
04100		IF FLG THEN GO L2;
04200		OPEN(3,"DSK",8,2,0,0,0,0);
04300	L3:	OUTSTR (".V3D AERIAL FILE = ");
04400		STR	←	INCHWL;
04500		LOOKUP(3,STR&".V3D",FLG);
04600		IF FLG THEN GO L3;
04700	END	"OPENER";
     

00100	α AERIAL VIEW;
00200		N	←	WORDIN(3);
00300	BEGIN	"AERIAL"
00400		REAL ARRAY ROAD [0:N,1:3];
00500		ARRYIN(3,ROAD[0,1],3*(N+1));
00600		RELEASE(3);
00700		DPYSET(DPYBUF);
00800		AIVECT (ROAD[0,1]*1.5,ROAD[0,2]*1.5);
00900		FOR I←1 STEP 1 UNTIL N DO
01000		AVECT (ROAD[I,1]*1.5,ROAD[I,2]*1.5);
01100		DPYOUT(1);
01200	END	"AERIAL";
01300		N	←	WORDIN(2);
01400		M	←	WORDIN(1);
01500	BEGIN	"DATA BLK"
01600		REAL ARRAY ROAD [0:N,1:3];
01700		REAL ARRAY COURSE [0:M,1:3];
01800		ARRYIN(2,ROAD[0,1],3*(N+1));
01900		RELEASE(2);
02000		ARRYIN(1,COURSE[0,1],3*(M+1));
02100		RELEASE(1);
02200	BEGIN	"SUBR"
     

00100	α GET CAMERA LOCATION AND ORIENTATION;
00200	PROCEDURE CAMLOCOR;
00300	BEGIN	"CAMERA"
00400		INTEGER OLDJ;
00500		REAL ST,CT,SP,CP;
00600	α  CAMERA AT CX1 LOOKING TOWARDS CX2;
00700		IF OLDJ≠J THEN
00800	BEGIN
00900		OLDJ	←	J;
01000		CX1	←	CX2;
01100		CY1	←	CY2;
01200		CZ1	←	CZ2;
01300		CX2	←	COURSE[J,1];
01400		CY2	←	COURSE[J,2];
01500		CZ2	←	COURSE[J,3];
01600	END;
01700		DX	←	CX1 - CX2;
01800		DY	←	CY1 - CY2;
01900		DZ	←	CZ1 - CZ2;
02000	α PAN THE CAMERA;
02100		CP	←	COS(PAN);
02200		SP	←	SIN(PAN);
02300		DX	←	CP*DX - SP*DY;
02400		DY	←	CP*DY + SP*DX;
02500	α TILT THE CAMERA;
02600		CT	←	COS(TILT);
02700		ST	←	SIN(TILT);
02800		DZ	←	CT*DZ - ST*DX;
02900		DX	←	CT*DX + ST*DZ;
03000		R	←	SQRT (DX↑2 + DY↑2 + DZ↑2);
03100	α PRINCIPLE AXIS;
03200		KX	←	DX/R;
03300		KY	←	DY/R;
03400		KZ	←	DZ/R;
03500	α HORIZONTAL AXIS;
03600		IX	←	-KY;
03700		IY	←	 KX;
03800		IZ	←	 0 ;
03900		R	←	SQRT (IX↑2 + IY↑2);
04000		IX	←	IX/R;
04100		IY	←	IY/R;
04200	α VERTICAL AXIS;
04300		JX	←	KY*IZ - KZ*IY;
04400		JY	←	KZ*IX - KX*IZ;
04500		JZ	←	KX*IY - KY*IX;
04600	α DISPLAY THE CART ON THE AERIAL VIEW;
04700		DPYSET(DPYBUF);
04800		AIVECT(CX2*1.5,CY2*1.5);
04900		AVECT(CX1*1.5,CY1*1.5);
05000		DPYSST("CART");
05100		DPYOUT(3);
05200	END	"CAMERA";
     

00100	α DISPLAY THE ROAD AS SEEN FROM THE CART'S CAMERA;
00200	PROCEDURE ROADPY;
00300	BEGIN	"ROAD"
00400		CAMLOCOR;
00500		DPYSET (DPYBUF);
00600		FOR I←1 STEP 1 UNTIL N DO
00700	BEGIN
00800		REAL X,Y,Z;
00900		X1	←	X2;
01000		Y1	←	Y2;
01100		Z1	←	Z2;
01200	
01300		X	←	ROAD[I,1] - CX1;
01400		Y	←	ROAD[I,2] - CY1;
01500		Z	←	ROAD[I,3] - CZ1;
01600		
01700		X2	←	IX*X + IY*Y + IZ*Z;
01800		Y2	←	JX*Y + JY*Y + JZ*Z;
01900		Z2	←	KX*Z + KY*Y + KZ*Z;
02000	
02100		IF Z2 ≤ -FOCAL THEN
02200	BEGIN
02300		X2	←	SX*X2/Z2;
02400		Y2	←	SY*Y2/Z2;
02500		Z2	←	SZ    /Z2;
02600	END 	ELSE
02700	BEGIN
02800		X2	←	X2;
02900		Y2	←	Y2;
03000		Z2	←	Z2 + FOCAL;
03100	END;
03200		CFLG	←	CLIPER;
03300		IF CFLG<3 THEN
03400	BEGIN
03500		AIVECT(XX1,YY1);
03600		AVECT(XX2,YY2);
03700	END;
03800	END;
03900		DPYOUT(2);
04000	END	"ROAD";
     

00100	α PROCESS COMMAND CHARACTER;
00200	PROCEDURE CAMCHR (INTEGER CHR);
00300	BEGIN	"CAMCHR"
00400		LABEL L;	REAL DEL;
00500		DEL	←	3.14159628 / 18;
00600	L:	IF CHR="(" THEN PAN←PAN-DEL ELSE
00700		IF CHR=")" THEN PAN←PAN+DEL ELSE
00800		IF CHR=":" THEN TILT←TILT+DEL ELSE
00900		IF CHR=";" THEN TILT←TILT-DEL ;
01000		CAMLOCOR;
01100		ROADPY;
01200		CHR	←	INCHRW;
01300		IF CHR≠'175 THEN GO L;
01400	END	"CAMCHR";
     

00100	α INITIALIZATION;
00200		J	←	0;
00300		CX2	←	COURSE[0,1];
00400		CY2	←	COURSE[0,2];
00500		CZ2	←	COURSE[0,3];
00600	α MAIN LISTEN LOOP;
00700		WHILE TRUE DO
00800	BEGIN	"LISTEN"
00900		INTEGER CHR;
01000		CHR	←	INCHRS;
01100		IF CHR<0 THEN	J← 1+ (J+1)MOD M ELSE CAMCHR(CHR);
01200		ROADPY;
01300	END	"LISTEN";
01400	END	"SUBR";
01500	END	"DATA BLK";
01600	END	"CARVEW"